#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h> // file option
#include <dirent.h>
// #include <iostream>
// #include <sstream>
// #include <vector>
// #include <list>
// #include <map>
// #include <thread>
// #include <string>
// #include <iomanip>
// #include <fstream>
// #include <vector>
// #include <set>
// #include <algorithm>
// #include <unordered_map>
// #include <mutex>
// #include <atomic>
// #include <bits/wordsize.h>
// #include <bits/timesize.h>
using namespace std;

//宏我特意将其叫做宏替换。说明宏就是替换后面的内容。
//特殊用法#a表示转为字符串
//__##a__，新命名。
//##__VA_ARGS__表示宏输入的多个阐述。
#define ADD_MACRO_DEF(a, b) a + b
#define myprintf(fmt, ...) printf("[%s,%s,%d]" fmt "\n", __FILE__, __func__, __LINE__, ##__VA_ARGS__);
#define STR_DATA_VAL(a) #a
#define VAL_ADD(a) HEAD_##a__D
int main()
{
    int a = 2, b = 3, c = 4, d;
    int VAL_ADD(a32) = 10;
    myprintf("%s", STR_DATA_VAL(1234));
    myprintf("%s", STR_DATA_VAL(VAL_ADD(a32)));
    myprintf("%d", VAL_ADD(a32));
    myprintf("%d", HEAD_a__D);
    //宏展开为 d = c * a + b
    //可能我们期望是：d = c * (a + b)
    d = c * ADD_MACRO_DEF(a, b);
    printf("%d!\n", d);
}
//输出
// 1234
// VAL_ADD(a32)
// 10
// 10
// 11!